<?php

namespace api\modules\v1\controllers\rbac;

use Yii;
use api\controllers\OnAuthController;
use common\models\rbac\Role;
use common\helpers\CommonHelper;
use api\modules\v1\forms\rbac\RoleForm;

/**
 * Class RoleController
 * @package api\modules\v1\controllers\rbac
 */
class RoleController extends OnAuthController
{
    /**
     * @var Role
     */
    public $modelClass = Role::class;


    /**
     * @api {get} /v1/rbac/role/list 角色列表
     * @apiName list
     * @apiGroup Role
     *
     * @apiParam {Number} page                          页码
     * @apiParam {Number} pageSize                      每页显示数量
     *
     * @apiSuccess {Object}  data                       返回数据
     * @apiSuccess {Number}  data.page                  当前页码
     * @apiSuccess {Number}  data.pageSize              每页显示数
     * @apiSuccess {Number}  data.total                 总数
     * @apiSuccess {Array}   data.list                  角色列表
     * @apiSuccess {Number}  data.list.id               角色ID
     * @apiSuccess {Number}  data.list.project_id       项目ID
     * @apiSuccess {String}  data.list.name             动作名称
     * @apiSuccess {String}  data.list.desc             角色描述
     * @apiSuccess {Number}  data.list.type             类型
     * @apiSuccess {String}  data.list.type_str         类型值
     * @apiSuccess {Number}  data.list.status           状态
     * @apiSuccess {String}  data.list.status_str       状态值
     * @apiSuccess {String}  data.list.is_edit          是否编辑【1是、0否】
     */
    public function actionList()
    {
        $params = Yii::$app->request->get();
        $params['project_id'] = $this->projectId;
        $page = $params['page'] ?? 1;
        $pageSize = $params['pageSize'] ?? 10;

        // 查询结果
        $data = Yii::$app->services->role->getListPage($params, (int)$page, (int)$pageSize);

        // 格式化列表数据
        $data['list'] = Yii::$app->services->role->getListPageFormat($data['list'], 0, $this->projectId);

        return $data;
    }

    /**
     * @api {get} /v1/rbac/role/system-list 系统角色列表
     * @apiName system-list
     * @apiGroup Role
     *
     * @apiParam {Number} page                          页码
     * @apiParam {Number} pageSize                      每页显示数量
     *
     * @apiSuccess {Object}  data                       返回数据
     * @apiSuccess {Number}  data.page                  当前页码
     * @apiSuccess {Number}  data.pageSize              每页显示数
     * @apiSuccess {Number}  data.total                 总数
     * @apiSuccess {Array}   data.list                  角色列表
     * @apiSuccess {Number}  data.list.id               角色ID
     * @apiSuccess {Number}  data.list.project_id       项目ID
     * @apiSuccess {String}  data.list.name             动作名称
     * @apiSuccess {String}  data.list.desc             角色描述
     * @apiSuccess {Number}  data.list.type             类型
     * @apiSuccess {String}  data.list.type_str         类型值
     * @apiSuccess {Number}  data.list.status           状态
     * @apiSuccess {String}  data.list.status_str       状态值
     * @apiSuccess {String}  data.list.is_edit          是否编辑【1是、0否】
     */
    public function actionSystemList()
    {
        $params = Yii::$app->request->get();
        $params['project_id'] = $this->projectId;
        $page = $params['page'] ?? 1;
        $pageSize = $params['pageSize'] ?? 10;

        // 查询结果
        $data = Yii::$app->services->role->getListPage($params, (int)$page, (int)$pageSize, 1);

        // 格式化列表数据
        $data['list'] = Yii::$app->services->role->getListPageFormat($data['list'], 1, $this->projectId);

        return $data;
    }

    /**
     * @api {get} /v1/rbac/role/info 角色详情
     * @apiName info
     * @apiGroup Role
     *
     * @apiParam {Number} id                                            角色ID
     *
     * @apiSuccess {Object}     data                                    返回数据
     * @apiSuccess {Number}     data.id                                 角色ID
     * @apiSuccess {String}     data.name                               动作名称
     * @apiSuccess {String}     data.desc                               角色描述
     * @apiSuccess {Number}     data.status                             状态
     * @apiSuccess {Array}      data.auth                               权限列表
     * @apiSuccess {Number}     data.auth.id                            菜单ID
     * @apiSuccess {String}     data.auth.name                          菜单名
     * @apiSuccess {Number}     data.auth.permission_type               权限类型【0模块、1菜单、2动作】
     * @apiSuccess {Boolean}    data.auth.expand                        是否展开【true、false】
     * @apiSuccess {Boolean}    data.auth.checked                       是否选中【true、false】
     * @apiSuccess {Array}      data.auth.action_list                   动作列表
     * @apiSuccess {Number}     data.auth.action_list.id                动作ID
     * @apiSuccess {String}     data.auth.action_list.name              动作名称
     * @apiSuccess {Number}     data.auth.action_list.permission_type   权限类型【1菜单、2动作】
     * @apiSuccess {Boolean}    data.auth.action_list.checked           是否选中【true、false】
     * @apiSuccess {Array}      data.auth.children                      子菜单【同上】
     */
    public function actionInfo()
    {
        $id = (int)Yii::$app->request->get('id', 0);

        // 角色信息
        $role = Yii::$app->services->role->findById($id);

        // 角色权限列表
        $auth = Yii::$app->services->role->getRoleAuthList($id);

        return [
            'id' => $role->id ?? 0,
            'name' => $role->name ?? '',
            'desc' => $role->desc ?? '',
            'status' => $role->status ?? Role::STATUS_ENABLE,
            'auth' => $auth,
        ];
    }

    /**
     * @api {post} /v1/rbac/role/create 新增角色
     * @apiName create
     * @apiGroup Role
     *
     * @apiParam {String} name                           角色名称
     * @apiParam {String} desc                           说明【选填】
     * @apiParam {Number} status                         状态【1启用、0停用】
     * @apiParam {Number} type                           类型【1普通角色、2系统角色】
     * @apiParam {String} menu_ids                       菜单IDs【多个用','分割】
     * @apiParam {String} action_ids                     动作IDs【多个用','分割】
     * @apiParam {String} module_ids                     模块IDs【多个用','分割】
     *
     * @apiSuccess {Object}  data                        返回数据
     * @apiSuccess {Number}  data.id                     角色ID
     */
    public function actionCreateRole()
    {
        $params = Yii::$app->request->post();
        $params['project_id'] = $this->projectId;

        $model = new RoleForm();
        $model->setScenario('create');
        $model->attributes = $params;
        if (!$model->validate()) {
            // 返回数据验证失败
            return CommonHelper::api(422, $this->getError($model));
        }

        return Yii::$app->services->role->create($model);
    }

    /**
     * @api {post} /v1/rbac/role/update 编辑角色
     * @apiName update
     * @apiGroup Role
     *
     * @apiParam {Number} id                             角色ID
     * @apiParam {String} name                           角色名称
     * @apiParam {String} desc                           说明【选填】
     * @apiParam {Number} status                         状态【1启用、0停用】
     * @apiParam {String} menu_ids                       菜单IDs【多个用','分割】
     * @apiParam {String} action_ids                     动作IDs【多个用','分割】
     * @apiParam {String} module_ids                     模块IDs【多个用','分割】
     *
     * @apiSuccess {Object}  data                        返回数据
     * @apiSuccess {Number}  data.id                     角色ID
     */
    public function actionUpdateRole()
    {
        $params = Yii::$app->request->post();
        $params['project_id'] = $this->projectId;

        $model = new RoleForm();
        $model->setScenario('edit');
        $model->attributes = $params;
        if (!$model->validate()) {
            // 返回数据验证失败
            return CommonHelper::api(422, $this->getError($model));
        }

        return Yii::$app->services->role->edit($model);
    }

    /**
     * @api {post} /v1/rbac/role/delete 删除角色
     * @apiName delete
     * @apiGroup Role
     *
     * @apiParam {Number} id                             角色ID
     *
     * @apiSuccess {Object}  data                        返回数据
     * @apiSuccess {Number}  data.id                     角色ID
     */
    public function actionDeleteRole()
    {
        $params = Yii::$app->request->post();
        $params['project_id'] = $this->projectId;

        $model = new RoleForm();
        $model->setScenario('delete');
        $model->attributes = $params;
        if (!$model->validate()) {
            // 返回数据验证失败
            return CommonHelper::api(422, $this->getError($model));
        }

        return Yii::$app->services->role->delete($model);
    }

    /**
     * @api {post} /v1/rbac/role/update-status 编辑角色状态
     * @apiName update-status
     * @apiGroup Role
     *
     * @apiParam {Number} id                             角色ID
     * @apiParam {Number} status                         状态【1启用、0停用】
     *
     * @apiSuccess {Object}  data                        返回数据
     * @apiSuccess {Number}  data.id                     角色ID
     */
    public function actionUpdateRoleStatus()
    {
        $params = Yii::$app->request->post();
        $params['project_id'] = $this->projectId;

        $model = new RoleForm();
        $model->setScenario('edit_status');
        $model->attributes = $params;
        if (!$model->validate()) {
            // 返回数据验证失败
            return CommonHelper::api(422, $this->getError($model));
        }

        return Yii::$app->services->role->editStatus($model);
    }
}
